package tsb.dtd;

import tsb.util.Balance;
import tsb.util.StrCmp;
import tsb.util.StrOp;
import tsb.util.XMLSintaxis;

/**
 *
 * valida el docinfo de un dtd
 */
public class ValidadorSintaxisPrologo {
    private String str;
    private ValidadorVariables validadorVariable;

    public ValidadorSintaxisPrologo() {
        this.validadorVariable = new ValidadorVariables();
    }
    
    public boolean validar(String aValidar) {
        boolean resultado = true;
        this.validadorVariable.clear();

        try {
            this.str = aValidar;
            if (StrCmp.esInicioFin(aValidar, "<?xml", "?>") == false) {
                resultado = false;
            }
            else if (Balance.esbalanceada(aValidar, '"', '"') == false) {
                resultado = false;
            }
            else if (StrCmp.tieneMasDe(aValidar, "<>", 1,false) == true) {
                resultado = false;
            }
            else if (StrCmp.tieneMasDe(aValidar, "?", 2,false) == true) {
                resultado = false;
            }
            else if (StrCmp.tieneMasDe(aValidar, "-!/", 0,false) == true) {
                resultado = false;
            }
            else if (this.validarVariables() == false) {
                resultado = false;
            }
            else if (XMLSintaxis.validarNombreTag(aValidar, "<?xml", "?>") == true) {
                resultado = false;
            }

        } catch (Exception e) {
            resultado = false;
        } finally {
            return resultado;
        }
    }

    private boolean validarVariables() {
        boolean resultado = true;
        String[] array = StrOp.separar(str, " ", "<?xml", "?>", '"', '"');

        for (int i = 0; i < array.length; i++) {
            String sAux = array[i];
            if (sAux != null && sAux.equals("") == false) {
                boolean bAux = this.validadorVariable.validar(sAux);
                if (bAux == false) {
                    resultado = false;
                    i = array.length;
                }
            }
        }
        return resultado;
    }
}
